#ifndef GUEST_H_
#define GUEST_H_

# include "stdio.h"
# include "stdlib.h"
# include "string.h"
# include "windows.h"

# include "all_struct.h"
# include "judge.h"
# include "tool.h"

/*
	此部分函数由周珂宇、栗浩越共同完成
	周：accountRecharge 、rollInfo 、alterpassword 、 refundTicket 、bookTicket
	栗：checkPersonalInfo 、refundTicket 、bookTicket
	周：后期整理优化+补充note注释
*/


//账户充值（guest）
static void accountRecharge(Guest* guestHead,N_guest *current_Guest)
{
	int rechargeMoney; //充值的金额
	char TorF;
	printf("您当前的账户余额为：");
	printf("%lf元\n",current_Guest->money);
	printf("是否需要给账户充值? (y:Yes/n:No)：");
	fflush(stdin);
	scanf("%c",&TorF);
	if(TorF == 'y' || TorF == 'Y')
	{
		printf("请输入您需要充值的金额(最小额度为100RMB)：");
		fflush(stdin);
		scanf("%d",&rechargeMoney);
		while (100 > rechargeMoney)//预防非法输入
		{
			fprintf (stdout,"充值金额数错误，请输入大于 100RMB 的额度：");
			scanf("%d",&rechargeMoney);
		}
		current_Guest->money += rechargeMoney;

		printf("请选择你的付款方式：\na)支付宝\nb)微信\n其他字符)其他\n\t\t 您的选择是：");
		scanf("%d",&rechargeMoney);
		printf("\n\n");

		printf("请扫描（假装有）该二维码\n");//模拟
		system("pause");

		printf("充值成功，当前账户余额为：%lf元\n",current_Guest->money);
	}

	else
	{
		printf("取消成功！即将返回上一级.....\n");
	}
	system("pause");

}

//注册信息 （guest）
//非法输入：超过数组界限、部分特定需求等
/*/注： 此处我们尝试了规范化使用goto语句来代替while语句 进行对部分非法输入异常后的补充处理，
		以此用于对比两者各自的优劣性。
		其他几处goto语句用意于此处基本相同，将不过多赘述。
*/
static void rollInfo(Guest* guestHead)
{

	Guest* newpassenger = (Guest*)malloc(sizeof(Guest));
	fprintf (stdout,"注意！一旦绑定不予修改\n");
	printf("请输入用户名(字符与数字总数不得超20，多余字符将自动舍去)：");
	while(1)
	{
		fflush(stdin);
		s_gets(newpassenger->userName,20);//预防非法输入
		if(judgeUserNameExsit(guestHead,newpassenger->userName))
		{
			printf("用户名已存在，请重新输入：");
		}
		else
			break;

	}

	printf("请输入密码(字符与数字总数不得超30，多余字符将自动舍去)：");
	fflush(stdin);
	s_gets(newpassenger->password,30);//预防非法输入

	int help1;
help1 :
	{
		printf("请输入身份证号(18位)：");
		fflush(stdin);
		s_gets(newpassenger->passcard,20);//预防非法输入
	}

	if (18 != strlen(newpassenger->passcard))//预防非法输入
	{
		fprintf(stdout,"格式错误，");
		goto help1;
	}
	if(judgePascardExsit(guestHead,newpassenger->passcard))
	{
		fprintf(stdout,"该身份证(paascard)用户已存在,");
		goto help1;
	}

	printf("请输入真实姓名：");
	fflush(stdin);
	s_gets(newpassenger->realName,30);//预防非法输入
	/*
	以后有时间写一个顺序表存放对应的ID和人名充当匹配组块（数据库）
	，从而可以判断真实姓名与否。
	*/

	int help3;
help3 :
	{
		printf("请输入专属电话（11）[开头数字一定为 1]：");
		fflush(stdin);
		s_gets(newpassenger->phone,20);//预防非法输入
	}
	if (11 != strlen(newpassenger->phone) || '1' != newpassenger->phone[0])//预防非法输入
	{
		fprintf(stdout,"格式错误，");
		goto help3;
	}

	//旅客其余信息inti
	newpassenger->money = 0;
	newpassenger->airnum = 0;
	newpassenger->next = guestHead->next;
	guestHead->next = newpassenger;

	printf("注册信息成功！\n");

	system("pause");

}

//修改密码（guest）
static void alterpassword(N_guest *current_Guest)
{
	char newpassword1[30];//新密码1
	char newpassword2[30];//新密码2 (compare 块
	char passcard[30];//用身份证来判断是否本人操作
	char TorF;//yes or no

	int help1;
help1 :
	{
		printf ("请输入您的身份证以确保为本人操作：");
		fflush(stdin);
		scanf("%s",passcard);
	}

	if( !strcmp(current_Guest->passcard,passcard) )
	{
		int help2 ;//新密码录用&&新密码确认步骤
help2 :
		{
			//新密码录用
			printf ("请输入新的密码：");
			fflush(stdin);
			scanf("%s",newpassword1);

			//新密码确认步骤1
			printf ("请再次输入新密码：");
			fflush(stdin);
			scanf("%s",newpassword2);
		}

		//新密码确认步骤2
		if( 0 == strcmp(newpassword2,newpassword1) )
		{
			strcpy(current_Guest->password, newpassword1 ) ;
			printf ("修改密码成功 ！\n\n  返回中，请稍后~~\n\n");
			system ("pause");
			return ;
		}
		else
		{
			fprintf (stdout,"两次输入密码不同，修改失败!\n\n是否重试？ (y:Yes/n:No)：");
			fflush(stdin);
			scanf("%c",&TorF);

			if(TorF == 'y' || TorF == 'Y')
				goto help2 ;

			else
				return ;

		}

	}

	else
	{
		fprintf (stdout,"输入身份证错误，修改失败!\n\n是否重试？ (y:Yes/n:No)：");
		fflush(stdin);
		scanf("%c",&TorF);

		if(TorF == 'y' || TorF == 'Y')
			goto help1 ;

		else
			return ;
	}

}

//查看个人信息 （guest）
static void checkPersonalInfo(Airplane* airplaneHead,N_guest *current_Guest)
{
	printf("\n--------------------  个人信息  ------------------------\n\n");
	printf("用户名：%s\n",current_Guest->userName);
	printf("密码  ：%s\n",current_Guest->password);
	printf("身份证号：%s\n",current_Guest->passcard);
	printf("真实姓名：%s\n\n",current_Guest->realName);
	printf("电话号码：%s\n",current_Guest->phone);
	printf("账户余额：%lf\n\n",current_Guest->money);


	printf("  ** ** ** **  预定航班  ** ** ** **\n\n");
	if ( current_Guest->airnum == 0)
	{
		printf(" > > 您当前没有预定过航班\n");
		system("pause");
		return ;
	}

	Airplane* p = airplaneHead->next;
	int newairnum = 0;//判定有没有过期航班的预定
	printf("航班号\t起飞城市\t抵达城市\t所属公司\t所属型号\t起飞-抵达时间\t\t");
	printf("订单金额(元)\t订单状态\n");
	while (p && current_Guest->airnum != 0)
	{
		for(int i = 0; i < p->personNumber ; i++)
		{
			if (0 == strcmp (current_Guest->passcard, p->Guest[i].passcard))  //have book
			{
				newairnum ++ ;
				Display4 (p);
				break;
			}
		}
		p = p -> next ;
	}
	if (current_Guest->airnum != newairnum)
		current_Guest->airnum = newairnum ;

	printf("\n\n已购票量：%d",current_Guest->airnum);
	printf("\n  ** ** ** **  EOF  ** ** ** **\n");

	system("pause");
	return ;

}

//选择航班订票（guest）
static void bookTicket(Airplane* airplaneHead,N_guest *current_Guest)
{
	Airplane* p = airplaneHead->next;

	if(p == NULL)
	{
		printf("目前线上没有运作的航班，请联系管理员添加~~\n");
		system("pause");
		return;
	}

	char flightNumber[25];
	printf("请输入需要预定的航班号：");
	fflush(stdin);
	scanf("%s",flightNumber);

	while(p)
	{
		if(judgeAirplaneRepeat(flightNumber, current_Guest, airplaneHead))
		{
			printf("\n抱歉，不可重复购买同一航班的机票\n");
			Sleep (1000) ;
			return;
		}

		if(0 == strcmp(p->flightNumber,flightNumber))
		{
			if(p->remainQuantity <= 0)
			{
				printf("抱歉！该航班的机票已被抢完，以下是类似航班~~\n");
				Recommend(p,airplaneHead);
				//fflush(stdin);
				printf("是否放弃本次订票？放弃输入数字‘0’，否则其他任意字符\n");

				char TesT;
				fflush(stdin);
				scanf("%c",&TesT);

				if ('0' == TesT)
					return;

				else
				{
					printf("请输入需要预定的航班号：");
					fflush(stdin);
					scanf("%s",flightNumber);
					p = airplaneHead->next;
					continue ;
				}

			}

			printf("起飞城市：%s\n",p->startCity);
			printf("抵达城市：%s\n",p->endCity);
			printf("所属公司：%s\n",p->company);
			printf("所属型号：%s\n",p->type);
			printf("起飞抵达时间：%d.%d.%d - %d:%d - %d:%d\n",
			       p->time.year,p->time.month,p->time.day,
			       p->time.original_hour,p->time.original_minute,
			       p->time.end_hour,p->time.end_minute);
			printf("折扣票价：%lf元\n",p->price - p->price*p->discount);
			printf("剩余票量：%d\n\n",p->remainQuantity);
			printf("确认支付购票吗？(y/n) :");

			char TorF;
			fflush(stdin);
			scanf("%c",&TorF);

			if(TorF == 'y' || TorF == 'Y')
			{
				/*	if(p->remainQuantity <= 0)
				//	{
				//	printf("抱歉！该航班的机票已被抢完，请选择其他的航班~~\n");
				//	}
				//	else if(p->price * p->discount > current_Guest->money)
				*/
				if(p->price - p->price * p->discount > current_Guest->money)
				{
					printf("您当前的余额不足，订票失败~\n");
					printf("以下为相似航线~~,希望对您有帮助\n");
					Recommend(p,airplaneHead);
				}
				else
				{
					//当前乘客预定票
					int d = current_Guest->airnum ;
					if (15 <= d)
					{
						fprintf (stdout,"超出个人可订未出行航班数量，暂时无法订票\n");
						return ;
					}


					p->remainQuantity -= 1;
					p->Guest[p->personNumber] = *current_Guest;
					p->personNumber++;
					printf("订票成功(=^ ^=), 请注意航班起飞时间，提前到达指定机场!\n");
					current_Guest->airnum ++;
					current_Guest->money -= p->price - p->price * p->discount;

				}
			}
			else
			{
				printf("取消成功！即将返回上一级.....\n");
			}
			break;
		}
		p = p->next;
	}

	if(p == NULL)
	{
		printf("抱歉！没有查询对应的航班...\n");
	}
	system("pause");

	return;
}

//退票（guest）
static void refundTicket(Airplane* airplaneHead,Guest* guestHead,N_guest *current_Guest)
{
	char flightNumber[25];

	if( 0 >=  current_Guest->airnum )
	{
		printf("您当前没有预定航班......\n\n");
		return;
	}

	printf("请输入航班号进行退票：");
	scanf("%s",flightNumber);

// step 1 :air basic INFO turn

	Airplane* p = airplaneHead->next;
	while(p)//寻找对应航班
	{
		if(0 == strcmp(p->flightNumber,flightNumber))
			break;

		p = p->next;
	}
	if (NULL == p)
	{
		printf("不存在该航班，请检查您的订单......\n\n");
		return ;
	}

	int keep = p->personNumber; //计数tech

	// step 2 :guest basic INFO turn

	for (int i = keep-1 ; 0 <= i;)
	{
		if (0 == strcmp(current_Guest->passcard, p -> Guest[i].passcard))
		{
			for (int j = i; j < keep-1 ; j++)
				p -> Guest[j] = p -> Guest[j + 1];

			p->personNumber -= 1;
			p->remainQuantity += 1;
			current_Guest->money += p->price - p->price * p->discount;
			current_Guest->airnum --;
			fprintf(stdout,"退票成功......\n\n");

			break;
		}

		i--;//利用此性质，判别情况的独立性
		if (-1 == i)
			fprintf(stdout,"您没有预定该航班，请检查您的订单......\n\n");

	}
	system("pause");

}


# endif